BasicDemoLineScanCamera.py

线阵相机基础示例

该示例程序演示线阵相机的基础使用方式,包括初始化SDK、枚举设备、创建实例和句柄等。

1 # -- coding: utf-8 --
2 
3 import sys
4 import os
5 import msvcrt
6 import ctypes
7 
8 sys.path.append(os.getenv('MVCAM_COMMON_RUNENV') + "/Samples/Python/MvImport")
9 from MvCameraControl_class import *
10 
11 if __name__ == "__main__":
12 
13  # ch:初始化SDK | en: initialize SDK
14  MvCamera.MV_CC_Initialize()
15 
16  deviceList = MV_CC_DEVICE_INFO_LIST()
17  t_layer_type = (MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE
18  | MV_GENTL_CXP_DEVICE | MV_GENTL_XOF_DEVICE)
19 
20  # ch:枚举设备 | en:Enum device
21  ret = MvCamera.MV_CC_EnumDevices(t_layer_type, deviceList)
22  if ret != 0:
23  print("error: enum devices fail! ret[0x%x]" % ret)
24  sys.exit()
25 
26  if deviceList.nDeviceNum == 0:
27  print("find no device!")
28  sys.exit()
29 
30  print("find %d devices!" % deviceList.nDeviceNum)
31 
32  for i in range(0, deviceList.nDeviceNum):
33  mvcc_dev_info = cast(deviceList.pDeviceInfo[i], POINTER(MV_CC_DEVICE_INFO)).contents
34  if mvcc_dev_info.nTLayerType == MV_GIGE_DEVICE or mvcc_dev_info.nTLayerType == MV_GENTL_GIGE_DEVICE:
35  print("gige device: [%d]" % i)
36  strModeName = ""
37  for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chModelName:
38  if 0 == per:
39  break
40  strModeName = strModeName + chr(per)
41  print("device model name: %s" % strModeName)
42 
43  nip1 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24)
44  nip2 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16)
45  nip3 = ((mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8)
46  nip4 = (mvcc_dev_info.SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff)
47  print("current ip: %d.%d.%d.%d" % (nip1, nip2, nip3, nip4))
48 
49  chUserDefinedName = ""
50  for per in mvcc_dev_info.SpecialInfo.stGigEInfo.chUserDefinedName:
51  if 0 == per:
52  break
53  chUserDefinedName = chUserDefinedName + chr(per)
54  print("device user define name: %s" % chUserDefinedName)
55  elif mvcc_dev_info.nTLayerType == MV_USB_DEVICE:
56  print("u3v device: [%d]" % i)
57  strModeName = ""
58  for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chModelName:
59  if per == 0:
60  break
61  strModeName = strModeName + chr(per)
62  print("device model name: %s" % strModeName)
63 
64  strSerialNumber = ""
65  for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chSerialNumber:
66  if per == 0:
67  break
68  strSerialNumber = strSerialNumber + chr(per)
69  print("user serial number: %s" % strSerialNumber)
70 
71  strUserDefinedName = ""
72  for per in mvcc_dev_info.SpecialInfo.stUsb3VInfo.chUserDefinedName:
73  if per == 0:
74  break
75  strUserDefinedName = strUserDefinedName + chr(per)
76  print("device user define name: %s" % strUserDefinedName)
77  elif mvcc_dev_info.nTLayerType == MV_GENTL_XOF_DEVICE:
78  print("XoF device: [%d]" % i)
79  strModeName = ""
80  for per in mvcc_dev_info.SpecialInfo.stXoFInfo.chModelName:
81  if per == 0:
82  break
83  strModeName = strModeName + chr(per)
84  print("device model name: %s" % strModeName)
85 
86  strSerialNumber = ""
87  for per in mvcc_dev_info.SpecialInfo.stXoFInfo.chSerialNumber:
88  if per == 0:
89  break
90  strSerialNumber = strSerialNumber + chr(per)
91  print("user serial number: %s" % strSerialNumber)
92 
93  strUserDefinedName = ""
94  for per in mvcc_dev_info.SpecialInfo.stXoFInfo.chUserDefinedName:
95  if per == 0:
96  break
97  strUserDefinedName = strUserDefinedName + chr(per)
98  print("device user define name: %s" % strUserDefinedName)
99  elif mvcc_dev_info.nTLayerType == MV_GENTL_CXP_DEVICE:
100  print("CXP device: [%d]" % i)
101  strModeName = ""
102  for per in mvcc_dev_info.SpecialInfo.stCXPInfo.chModelName:
103  if per == 0:
104  break
105  strModeName = strModeName + chr(per)
106  print("device model name: %s" % strModeName)
107 
108  strSerialNumber = ""
109  for per in mvcc_dev_info.SpecialInfo.stCXPInfo.chSerialNumber:
110  if per == 0:
111  break
112  strSerialNumber = strSerialNumber + chr(per)
113  print("user serial number: %s" % strSerialNumber)
114 
115  strUserDefinedName = ""
116  for per in mvcc_dev_info.SpecialInfo.stCXPInfo.chUserDefinedName:
117  if per == 0:
118  break
119  strUserDefinedName = strUserDefinedName + chr(per)
120  print("device user define name: %s" % strUserDefinedName)
121  elif mvcc_dev_info.nTLayerType == MV_GENTL_CAMERALINK_DEVICE:
122  print("CML device: [%d]" % i)
123  strModeName = ""
124  for per in mvcc_dev_info.SpecialInfo.stCMLInfo.chModelName:
125  if per == 0:
126  break
127  strModeName = strModeName + chr(per)
128  print("device model name: %s" % strModeName)
129 
130  strSerialNumber = ""
131  for per in mvcc_dev_info.SpecialInfo.stCMLInfo.chSerialNumber:
132  if per == 0:
133  break
134  strSerialNumber = strSerialNumber + chr(per)
135  print("user serial number: %s" % strSerialNumber)
136 
137  strUserDefinedName = ""
138  for per in mvcc_dev_info.SpecialInfo.stCMLInfo.chUserDefinedName:
139  if per == 0:
140  break
141  strUserDefinedName = strUserDefinedName + chr(per)
142  print("device user define name: %s" % strUserDefinedName)
143 
144  nConnectionNum = input("please input the number of the device to connect:")
145 
146  if int(nConnectionNum) >= deviceList.nDeviceNum:
147  print("error: input error!")
148  sys.exit()
149 
150  # ch:创建相机实例 | en:Creat Camera Object
151  cam = MvCamera()
152 
153  # ch:选择设备并创建句柄 | en:Select device and create handle
154  stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
155 
156  ret = cam.MV_CC_CreateHandle(stDeviceList)
157  if ret != 0:
158  print("error: create handle fail! ret[0x%x]" % ret)
159  sys.exit()
160 
161  # ch:打开设备 | en:Open device
162  ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
163  if ret != 0:
164  print("error: open device fail! ret[0x%x]" % ret)
165  sys.exit()
166 
167  # ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
168  if stDeviceList.nTLayerType == MV_GIGE_DEVICE or stDeviceList.nTLayerType == MV_GENTL_GIGE_DEVICE:
169  nPacketSize = cam.MV_CC_GetOptimalPacketSize()
170  if int(nPacketSize) > 0:
171  ret = cam.MV_CC_SetIntValue("GevSCPSPacketSize", nPacketSize)
172  if ret != 0:
173  print("warning: Set Packet Size fail! ret[0x%x]" % ret)
174  else:
175  print("warning: Get Packet Size fail! ret[0x%x]" % nPacketSize)
176 
177  # ch:设置触发模式为off | en:Set trigger mode as off
178  ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
179  if ret != 0:
180  print("error: set trigger mode fail! ret[0x%x]" % ret)
181  sys.exit()
182 
183  # ch 设置数字增益 | en: Set digital shift
184  ret = cam.MV_CC_SetBoolValue("DigitalShiftEnable", True)
185  if ret != 0:
186  print("error: set digital shift enable fail! ret[0x%x]" % ret)
187 
188  ret = cam.MV_CC_SetFloatValue("DigitalShift", 0)
189  if ret != 0:
190  print("error: set digital shift fail! ret[0x%x]" % ret)
191 
192  # ch 设置行频 | en: Set acquisition line rate
193  ret = cam.MV_CC_SetIntValue("AcquisitionLineRate", 10000)
194  if ret != 0:
195  print("error: set acquisition line rate fail! ret[0x%x]" % ret)
196 
197  ret = cam.MV_CC_SetBoolValue("AcquisitionLineRateEnable", True)
198  if ret != 0:
199  print("error: set acquisition line rate enable fail! ret[0x%x]" % ret)
200 
201  # ch 设置HB模式 | en: Set image compression mode:HB
202  ret = cam.MV_CC_SetEnumValueByString("ImageCompressionMode", "HB")
203  if ret != 0:
204  print("error: set image compression mode: HB fail! ret[0x%x]" % ret)
205  sys.exit()
206 
207  # ch:获取数据包大小 | en:Get payload size
208  stParam = MVCC_INTVALUE()
209  memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
210 
211  ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
212  if ret != 0:
213  print("get payload size fail! ret[0x%x]" % ret)
214  sys.exit()
215  nPayloadSize = stParam.nCurValue
216 
217  # ch:开始取流 | en:Start grab image
218  ret = cam.MV_CC_StartGrabbing()
219  if ret != 0:
220  print("error: start grabbing fail! ret[0x%x]" % ret)
221  sys.exit()
222 
223  stOutFrame = MV_FRAME_OUT()
224  memset(byref(stOutFrame), 0, sizeof(stOutFrame))
225 
226  ret = cam.MV_CC_GetImageBuffer(stOutFrame, 1000)
227  if None != stOutFrame.pBufAddr and 0 == ret:
228  print("get one frame: Width[%d], Height[%d], nFrameNum[%d]" % (
229  stOutFrame.stFrameInfo.nWidth, stOutFrame.stFrameInfo.nHeight, stOutFrame.stFrameInfo.nFrameNum))
230 
231  # ch:无损解码 | High Bandwidth decode
232  dst_size = nPayloadSize
233  HB_decode_param = MV_CC_HB_DECODE_PARAM()
234  HB_decode_param.pSrcBuf = stOutFrame.pBufAddr
235  HB_decode_param.nSrcLen = stOutFrame.stFrameInfo.nFrameLen
236  HB_decode_param.nDstBufSize = dst_size
237  HB_decode_param.pDstBuf = (c_ubyte * dst_size)()
238  ret = cam.MV_CC_HBDecode(HB_decode_param)
239  if ret != 0:
240  print("error: high bandwidth decode fail! ret[0x%x]" % ret)
241  sys.exit()
242  else:
243  print("high bandwidth decode ok, dst pixel type is [%d]" % HB_decode_param.enDstPixelType)
244 
245  # ch:保存图像 | en:Save image
246 
247  c_file_path = "image.bmp".encode('ascii')
248  nRGBSize = stOutFrame.stFrameInfo.nWidth * stOutFrame.stFrameInfo.nHeight * 4 + 2048
249  stSaveParam = MV_SAVE_IMAGE_TO_FILE_PARAM_EX()
250  memset(byref(stSaveParam), 0, sizeof(stSaveParam))
251  stSaveParam.nWidth = stOutFrame.stFrameInfo.nWidth
252  stSaveParam.nHeight = stOutFrame.stFrameInfo.nHeight
253  stSaveParam.pData = HB_decode_param.pDstBuf
254  stSaveParam.enImageType = MV_Image_Bmp
255  stSaveParam.nDataLen = HB_decode_param.nDstBufLen
256  stSaveParam.enPixelType = HB_decode_param.enDstPixelType
257  stSaveParam.nQuality = 80
258  stSaveParam.iMethodValue = 3
259  stSaveParam.pcImagePath = ctypes.create_string_buffer(c_file_path)
260  ret = cam.MV_CC_SaveImageToFileEx(stSaveParam)
261  if ret != 0:
262  print("error: save image to file fail! ret[0x%x]" % ret)
263  sys.exit()
264  else:
265  print("save image to file is OK")
266 
267  cam.MV_CC_FreeImageBuffer(stOutFrame)
268 
269  else:
270  print("error: get one frame fail, ret[0x%x]" % ret)
271 
272  print("press a key to continue.")
273  msvcrt.getch()
274 
275  # ch:停止取流 | en:Stop grab image
276  ret = cam.MV_CC_StopGrabbing()
277  if ret != 0:
278  print("error: stop grabbing fail! ret[0x%x]" % ret)
279  sys.exit()
280 
281  # ch:关闭设备 | Close device
282  ret = cam.MV_CC_CloseDevice()
283  if ret != 0:
284  print("error: close device fail! ret[0x%x]" % ret)
285  sys.exit()
286 
287  # ch:销毁句柄 | Destroy handle
288  ret = cam.MV_CC_DestroyHandle()
289  if ret != 0:
290  print("error: destroy handle fail! ret[0x%x]" % ret)
291  sys.exit()
292 
293  # ch:反初始化SDK | en: finalize SDK
294  MvCamera.MV_CC_Finalize()